//+------------------------------------------------------------------+
//|                 ChartObjectsArrows.mqh MQL5 图表箭头类头文件     |
//|                版权所有 2000-2025, MetaQuotes Ltd.              |
//|                        官方网址: https://www.mql5.com            |
//+------------------------------------------------------------------+
//| 包含所有图表箭头对象类（通用箭头、点赞/踩、上下箭头、状态标志等）     |
//+------------------------------------------------------------------+
#include "ChartObject.h"  // 引入图表对象基类 CChartObject（提供通用属性与生命周期管理）

//+------------------------------------------------------------------+
//| CChartObjectArrow 类（通用图表箭头基类）                          |
//| 功能：MQL5 通用图表箭头对象的基类，支持自定义箭头符号与锚点方式       |
//| 继承关系：public CChartObject（基于图表对象基类，扩展箭头特有属性）   |
//| 核心特性：                                                      |
//|  1. 支持自定义箭头符号（通过 ASCII 码或 MQL5 预定义箭头常量）       |
//|  2. 可配置锚点方式（控制箭头相对于坐标点的对齐位置）               |
//|  3. 继承基类的颜色、线型、可见周期等通用属性                       |
//|  4. 支持对象参数的文件序列化（保存/加载箭头配置）                   |
//+------------------------------------------------------------------+
class CChartObjectArrow : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化通用箭头对象
    * @details 调用父类 CChartObject 构造函数，初始化箭头对象的基础属性（未绑定图表）
    */
                     CChartObjectArrow(void);

   /**
    * @brief 析构函数：销毁通用箭头对象
    * @details 依赖父类析构逻辑，自动删除图表上的箭头对象，释放资源
    */
                    ~CChartObjectArrow(void);

   //--- 箭头对象创建接口
   /**
    * @brief 在指定图表创建通用箭头对象
    * @param chart_id [in] 目标图表 ID（0 表示当前图表，可通过 ChartID() 获取）
    * @param name [in] 箭头对象唯一名称（图表内不可重复）
    * @param window [in] 子窗口编号（0=主窗口，≥1=指标子窗口）
    * @param time [in] 箭头的时间坐标（对应 K 线时间，如 D'2024.01.01'）
    * @param price [in] 箭头的价格坐标（对应图表价格，如 1.20000）
    * @param code [in] 箭头符号代码（ASCII 码或 MQL5 预定义箭头常量，如 233 表示向上箭头）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定+符号设置完成），false 表示失败
    * @note 创建流程：1. 调用 ObjectCreate 创建图表箭头；2. 调用 Attach 绑定对象；3. 设置箭头符号
    */
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price,const char code);

   //--- 对象类型标识（重写基类方法）
   /**
    * @brief 获取箭头对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_ARROW，代表通用箭头对象）
    */
   virtual int       Type(void) const { return(OBJ_ARROW); }

   //--- 箭头特有属性接口
   /**
    * @brief 获取当前箭头的符号代码
    * @return char - 箭头符号代码（ASCII 码或 MQL5 预定义箭头常量，0 表示获取失败）
    */
   char              ArrowCode(void) const;

   /**
    * @brief 设置箭头的符号代码
    * @param code [in] 新箭头符号代码（ASCII 码或 MQL5 预定义箭头常量）
    * @return bool - 操作结果：true 表示设置成功，false 表示失败（未绑定图表）
    */
   virtual bool      ArrowCode(const char code) const;

   /**
    * @brief 获取箭头的锚点方式（箭头相对于坐标点的对齐位置）
    * @return ENUM_ARROW_ANCHOR - 锚点方式（如 ANCHOR_CENTER 表示中心对齐，ANCHOR_BOTTOM 表示底部对齐）
    */
   ENUM_ARROW_ANCHOR Anchor(void) const;

   /**
    * @brief 设置箭头的锚点方式
    * @param anchor [in] 新锚点方式（需为 ENUM_ARROW_ANCHOR 枚举值）
    * @return bool - 操作结果：true 表示设置成功，false 表示失败（未绑定图表）
    */
   virtual bool      Anchor(const ENUM_ARROW_ANCHOR anchor) const;

   //--- 序列化接口（重写基类方法，扩展箭头特有属性的读写）
   /**
    * @brief 将箭头对象参数（含特有属性）保存到文件
    * @param file_handle [in] 文件句柄（需提前以 FILE_WRITE 模式打开）
    * @return bool - 操作结果：true 表示保存成功，false 表示失败（文件无效/未绑定图表）
    * @note 保存内容：基类通用属性 + 箭头符号代码 + 锚点方式
    */
   virtual bool      Save(const int file_handle);

   /**
    * @brief 从文件加载箭头对象参数（含特有属性）
    * @param file_handle [in] 文件句柄（需提前以 FILE_READ 模式打开）
    * @return bool - 操作结果：true 表示加载成功，false 表示失败（文件无效/未绑定图表）
    * @note 加载后覆盖箭头符号代码与锚点方式，需确保文件为 Save 方法生成的格式
    */
   virtual bool      Load(const int file_handle);
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowThumbUp 类（“点赞”箭头对象）                     |
//| 功能：MQL5 图表“点赞”图标箭头（固定符号为 thumbs-up，不可修改）    |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号修改）|
//| 核心特性：                                                      |
//|  1. 固定箭头符号为“点赞”（OBJ_ARROW_THUMB_UP 类型）                |
//|  2. 禁止修改箭头符号（重写 ArrowCode 方法返回 false）              |
//|  3. 继承基类的锚点、颜色、可见周期等其他属性                       |
//+------------------------------------------------------------------+
class CChartObjectArrowThumbUp : public CChartObjectArrow
  {
public:
   /**
    * @brief 构造函数：初始化“点赞”箭头对象
    * @details 调用父类 CChartObjectArrow 构造函数
    */
                     CChartObjectArrowThumbUp(void);

   /**
    * @brief 析构函数：销毁“点赞”箭头对象
    * @details 依赖父类析构逻辑，自动删除图表上的对象
    */
                    ~CChartObjectArrowThumbUp(void);

   //--- 专用创建接口（无需指定符号，固定为“点赞”）
   /**
    * @brief 在指定图表创建“点赞”箭头对象（符号固定，无需传入 code 参数）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 箭头对象唯一名称
    * @param window [in] 子窗口编号
    * @param time [in] 时间坐标
    * @param price [in] 价格坐标
    * @return bool - 操作结果：true 表示创建成功，false 表示失败
    * @note 创建时自动使用 OBJ_ARROW_THUMB_UP 类型，符号不可修改
    */
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);

   //--- 重写对象类型标识
   /**
    * @brief 获取“点赞”箭头对象类型
    * @return int - 对象类型标识（返回 OBJ_ARROW_THUMB_UP）
    */
   virtual int       Type(void) const override { return(OBJ_ARROW_THUMB_UP); }

   //--- 禁止修改箭头符号（重写父类方法）
   /**
    * @brief 禁止修改“点赞”箭头的符号（固定为 thumbs-up，此方法始终返回 false）
    * @param code [in] 无效参数（无论传入何值均不生效）
    * @return bool - 操作结果：始终返回 false（禁止修改符号）
    */
   virtual bool      ArrowCode(const char code) const override { return(false); }

   /**
    * @brief 获取“点赞”箭头的符号代码（复用父类实现，返回固定符号）
    * @return char - 箭头符号代码（固定为“点赞”对应的 ASCII 码）
    */
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowThumbDown 类（“踩”箭头对象）                     |
//| 功能：MQL5 图表“踩”图标箭头（固定符号为 thumbs-down，不可修改）    |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号修改）|
//| 核心特性：与“点赞”箭头一致，仅符号和类型标识不同                  |
//+------------------------------------------------------------------+
class CChartObjectArrowThumbDown : public CChartObjectArrow
  {
public:
                     CChartObjectArrowThumbDown(void);
                    ~CChartObjectArrowThumbDown(void);
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);
   virtual int       Type(void) const override { return(OBJ_ARROW_THUMB_DOWN); }
   virtual bool      ArrowCode(const char code) const override { return(false); }
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowUp 类（“向上”箭头对象）                          |
//| 功能：MQL5 图表“向上”箭头（固定符号为↑，不可修改）                |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号修改）|
//| 核心特性：与“点赞”箭头一致，仅符号和类型标识不同                  |
//+------------------------------------------------------------------+
class CChartObjectArrowUp : public CChartObjectArrow
  {
public:
                     CChartObjectArrowUp(void);
                    ~CChartObjectArrowUp(void);
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);
   virtual int       Type(void) const override { return(OBJ_ARROW_UP); }
   virtual bool      ArrowCode(const char code) const override { return(false); }
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowDown 类（“向下”箭头对象）                        |
//| 功能：MQL5 图表“向下”箭头（固定符号为↓，不可修改）                |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号修改）|
//| 核心特性：与“向上”箭头一致，仅符号和类型标识不同                  |
//+------------------------------------------------------------------+
class CChartObjectArrowDown : public CChartObjectArrow
  {
public:
                     CChartObjectArrowDown(void);
                    ~CChartObjectArrowDown(void);
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);
   virtual int       Type(void) const override { return(OBJ_ARROW_DOWN); }
   virtual bool      ArrowCode(const char code) const override { return(false); }
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowStop 类（“停止”标志箭头对象）                    |
//| 功能：MQL5 图表“停止”图标箭头（固定符号为停止标志，不可修改）      |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号修改）|
//| 核心特性：与“点赞”箭头一致，仅符号和类型标识不同                  |
//+------------------------------------------------------------------+
class CChartObjectArrowStop : public CChartObjectArrow
  {
public:
                     CChartObjectArrowStop(void);
                    ~CChartObjectArrowStop(void);
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);
   virtual int       Type(void) const override { return(OBJ_ARROW_STOP); }
   virtual bool      ArrowCode(const char code) const override { return(false); }
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowCheck 类（“确认”标志箭头对象）                  |
//| 功能：MQL5 图表“确认”图标箭头（固定符号为对勾，不可修改）          |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号修改）|
//| 核心特性：与“点赞”箭头一致，仅符号和类型标识不同                  |
//+------------------------------------------------------------------+
class CChartObjectArrowCheck : public CChartObjectArrow
  {
public:
                     CChartObjectArrowCheck(void);
                    ~CChartObjectArrowCheck(void);
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);
   virtual int       Type(void) const override { return(OBJ_ARROW_CHECK); }
   virtual bool      ArrowCode(const char code) const override { return(false); }
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowLeftPrice 类（“左侧价格标签”箭头对象）            |
//| 功能：MQL5 图表“左侧价格标签”箭头（固定符号与锚点，均不可修改）    |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号与锚点）|
//| 核心特性：                                                      |
//|  1. 固定箭头符号为左侧价格标签样式（OBJ_ARROW_LEFT_PRICE 类型）    |
//|  2. 禁止修改箭头符号与锚点方式（重写对应方法返回 false）            |
//|  3. 继承基类的颜色、可见周期等其他属性                             |
//+------------------------------------------------------------------+
class CChartObjectArrowLeftPrice : public CChartObjectArrow
  {
public:
   /**
    * @brief 构造函数：初始化“左侧价格标签”箭头对象
    * @details 调用父类 CChartObjectArrow 构造函数
    */
                     CChartObjectArrowLeftPrice(void);

   /**
    * @brief 析构函数：销毁“左侧价格标签”箭头对象
    * @details 依赖父类析构逻辑，自动删除图表上的对象
    */
                    ~CChartObjectArrowLeftPrice(void);

   //--- 专用创建接口（无需指定符号，固定为左侧价格标签）
   /**
    * @brief 在指定图表创建“左侧价格标签”箭头对象（符号与锚点固定）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 箭头对象唯一名称
    * @param window [in] 子窗口编号
    * @param time [in] 时间坐标
    * @param price [in] 价格坐标
    * @return bool - 操作结果：true 表示创建成功，false 表示失败
    */
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);

   //--- 重写对象类型标识
   /**
    * @brief 获取“左侧价格标签”箭头对象类型
    * @return int - 对象类型标识（返回 OBJ_ARROW_LEFT_PRICE）
    */
   virtual int       Type(void) const override { return(OBJ_ARROW_LEFT_PRICE); }

   //--- 禁止修改箭头符号与锚点（重写父类方法）
   /**
    * @brief 禁止修改“左侧价格标签”箭头的符号（固定样式，此方法始终返回 false）
    * @param code [in] 无效参数
    * @return bool - 操作结果：始终返回 false
    */
   virtual bool      ArrowCode(const char code) const override { return(false); }

   /**
    * @brief 获取“左侧价格标签”箭头的符号代码（复用父类实现）
    * @return char - 箭头符号代码（固定为左侧价格标签对应的 ASCII 码）
    */
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }

   /**
    * @brief 禁止修改“左侧价格标签”箭头的锚点方式（固定对齐方式，此方法始终返回 false）
    * @param anchor [in] 无效参数
    * @return bool - 操作结果：始终返回 false
    */
   virtual bool      Anchor(const ENUM_ARROW_ANCHOR anchor) const override { return(false); }

   /**
    * @brief 获取“左侧价格标签”箭头的锚点方式（复用父类实现，返回固定锚点）
    * @return ENUM_ARROW_ANCHOR - 锚点方式（固定为左侧价格标签的对齐方式）
    */
   ENUM_ARROW_ANCHOR Anchor(void) const { return(CChartObjectArrow::Anchor()); }
  };

//+------------------------------------------------------------------+
//| CChartObjectArrowRightPrice 类（“右侧价格标签”箭头对象）           |
//| 功能：MQL5 图表“右侧价格标签”箭头（固定符号与锚点，均不可修改）    |
//| 继承关系：public CChartObjectArrow（基于通用箭头基类，限制符号与锚点）|
//| 核心特性：与“左侧价格标签”箭头一致，仅符号、锚点和类型标识不同      |
//+------------------------------------------------------------------+
class CChartObjectArrowRightPrice : public CChartObjectArrow
  {
public:
                     CChartObjectArrowRightPrice(void);
                    ~CChartObjectArrowRightPrice(void);
   bool              Create(long chart_id,const string name,const int window,const datetime time,const double price);
   virtual int       Type(void) const override { return(OBJ_ARROW_RIGHT_PRICE); }
   virtual bool      ArrowCode(const char code) const override { return(false); }
   char              ArrowCode(void) const { return(CChartObjectArrow::ArrowCode()); }
   virtual bool      Anchor(const ENUM_ARROW_ANCHOR anchor) const override { return(false); }
   ENUM_ARROW_ANCHOR Anchor(void) const { return(CChartObjectArrow::Anchor()); }
  };
//+------------------------------------------------------------------+